/**
 * es5 类的实现和继承
 */
// 父类
function Parent (name) {
  this.name = name
  this.age = 100
  this.fn = () => {
    console.log(123)
  }
}

// 定义静态属性和方法？
Parent.ui = 1
console.log(this)
Parent.fn = () => { console.log(this) }
Parent.fn2 = function () {
  console.log(this)
}

// 原型方法
Parent.prototype.getName = function () {
  console.log(this.name)
}

/**
 * 继承
 * 1. 继承实例属性和方法
 * 2. 继承原型属性和方法
 */
// 子类
function Child (name) {
  // 继承实例属性和方法
  Parent.call(this, name)
}

// 继承原型属性和方法
Child.prototype = Object.create(Parent.prototype, {
  constructor: {
    value: Child
  }
})

// 测试
// let chi = new Child('普京')
// console.log(chi)

/**
 * es6类的实现和继承
 */
class Par {
  constructor(name) {
    // 实例
    this.name = name
    this.age = 28
  }

  // 原型
  getName () {
    console.log(this.name)
  }

}
// let par = new Par('小红')
// console.log(par)
// 继承=》
class Chi extends Par {
  constructor(name) {
    super(name)
    this.ot = 100
    this.fn2 = () => { }
  }
  // 实例的属性和方法
  bc = { a: 1 }
  abc = 10
  fn = () => {
    console.log(this.abc)
  }

  // 原型上的方法
  getOt () {
    console.log(this.ot)
  }

  // 定义静态属性和方法
  static ui2 = 3
}

Chi.ui = 2

let chi = new Chi('小刚')
console.log(chi)
